//
// "Flow" module for the Zen Grids system.
//


@import "./grids";


//
// Apply this to an HTML item that is in the normal flow of a document to help
// align it to the grid. @see http://next.zengrids.com/reference/flow/#zen-float
//
@mixin zen-flow-item-width(
  $column-span,
  $parent-column-span   : false,
  $alpha-gutter         : false,
  $omega-gutter         : true,
  $direction            : $zen-direction,
  $columns              : $zen-columns,
  $gutters              : $zen-gutters,
  $gutter-method        : $zen-gutter-method,
  $grid-width           : $zen-grid-width,
  $box-sizing           : $zen-box-sizing,
  $switch-direction     : $zen-switch-direction,
  $include-base         : $zen-auto-include-flow-item-base
) {

  // Save the columns and gutters from the parent context.
  $main-columns: $columns;
  $main-gutters: $gutters;
  $main-grid-width: $grid-width;

  // Find the parent context for fluid layouts.
  @if unit($grid-width) == "%" {
    // The number of columns the parent element spans is our new column count.
    @if $parent-column-span != false {
      $columns: $parent-column-span;
    }
    @else {
      // If we don't know the number of columns the parent element spans, then
      // warn the user and force the flow item to span 100% of the parent.
      @warn "For responsive layouts with a percentage-based grid width, you must set the $parent-column-span to the number of columns that the parent element spans.";
      $column-span: $columns;
    }
    // We want our inner grid to span the entire width of the parent.
    $grid-width: 100%;
  }

  // Determine the flow direction and its reverse.
  $dir: $direction;
  @if $switch-direction {
    $dir: zen-direction-switch($dir);
  }
  $rev: zen-direction-switch($dir);

  // Calculate the new gutters when the layout and gutters are both fluid.
  @if unit($grid-width) == "%" and unit($gutters) == "%" {
    // Calculate the parent's width.
    $parent-width: zen-grid-item-width($parent-column-span, $main-columns, $main-gutters, $gutter-method, $main-grid-width, $box-sizing);
    // Calculate the new gutters.
    $gutters: $main-gutters * ($grid-width / $parent-width);
  }

  // Include the flow item base mixin.
  @if $include-base {
    @include zen-flow-item-base($gutters, $gutter-method, $box-sizing, $direction, $switch-direction);
  }

  // Calculate the item's width.
  $width: zen-grid-item-width($column-span, $columns, $gutters, $gutter-method, $grid-width, $box-sizing);
  @if $gutter-method == padding and unit($grid-width) != "%" and not $alpha-gutter and not $omega-gutter and ($box-sizing == border-box or $box-sizing == universal-border-box) {
    $width: $width - $gutters;
  }
  width: $width;

  @if $gutter-method == margin {
    @if $alpha-gutter {
      margin-#{$dir}: $gutters;
    }
    @if $omega-gutter {
      margin-#{$rev}: $gutters;
    }
  }
  @else if unit($grid-width) == "%" {
    // Our percentage $width is off since the parent has $main-gutters padding.
    // Calculate an adjusted gutter to fix the width.
    $adjusted-gutter: ($columns - $column-span) * $gutters / $columns;

    // Ensure the HTML item either has a full gutter or no gutter on each side.
    padding-#{$dir}: 0;
    @if $alpha-gutter {
      margin-#{$dir}: $gutters;
    }
    padding-#{$rev}: $adjusted-gutter;
    @if $omega-gutter {
      margin-#{$rev}: $gutters - $adjusted-gutter;
    }
    @else {
      margin-#{$rev}: -($adjusted-gutter);
    }
  }
  @else {
    @if $alpha-gutter and $omega-gutter {
      @if $gutters != 0 {
        margin: {
          #{$dir}: zen-half-gutter($gutters, left, $dir);
          #{$rev}: zen-half-gutter($gutters, right, $dir);
        }
      }
    }
    @else if not $alpha-gutter and not $omega-gutter {
      @if $gutters != 0 {
        padding: {
          left: 0;
          right: 0;
        }
      }
    }
    @else if $omega-gutter {
      padding-#{$dir}: 0;
      padding-#{$rev}: $gutters;
    }
    @else {
      padding-#{$dir}: $gutters;
      padding-#{$rev}: 0;
    }
  }
}

//
// Applies a standard set of properites to all flow items.
// @see http://next.zengrids.com/reference/grids/#zen-grid-item-base
//
@mixin zen-flow-item-base(
  $gutters                  : $zen-gutters,
  $gutter-method            : $zen-gutter-method,
  $box-sizing               : $zen-box-sizing,
  $direction                : $zen-direction,
  $switch-direction         : $zen-switch-direction
) {

  // Since we have to set padding in zen-flow-item-width(), supress extraneous
  // padding declarations in the base by setting $gutter-method to none.
  @if $gutter-method == padding {
    $gutter-method: none;
  }
  @include zen-grid-item-base($gutters, $gutter-method, $box-sizing, $direction, $switch-direction);
}

//
// Apply this to flow items that need to be floated.
// @see http://next.zengrids.com/reference/flow/#zen-float
//
@mixin zen-float(
  $direction          : $zen-direction,
  $switch-direction   : $zen-switch-direction
) {
  // Determine the float direction.
  $dir: $direction;
  @if $switch-direction {
    $dir: zen-direction-switch($dir);
  }
  float: $dir;
}

